package com.witker.common.base;

import com.alibaba.fastjson.JSON;
import com.witker.common.util.ClassReflectUtil;
import com.witker.common.util.ClassTypeUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * 视图控制器的基类
 * Created by BOCAI on 2018/9/16 23:29.
 */
public abstract class ModelBase {

    /**
     * 日志记录器
     */
    protected Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 获取视图返回对象
     * @param code 状态码
     * @param message 提示信息
     * @param data 返回数据
     * @return 返回视图返回对象
     */
    protected Object getResult(int code, String message, Object data){
        return new ModelResult(code, message, data);
    }

    /**
     * 获取视图返回对象
     * @param code 状态码
     * @param message 提示信息
     * @return 返回视图返回对象
     */
    protected Object getResult(int code, String message){
        return this.getResult(code, message, null);
    }

    /**
     * 获取视图返回对象
     * @param code 状态码
     * @param data 返回数据
     * @return 返回视图返回对象
     */
    protected Object getResult(int code, Object data){
        String message = this.getMessage(code);
        return this.getResult(code,message,data);
    }

    /**
     * 获取视图返回对象
     * @param code 状态码
     * @return 返回视图返回对象
     */
    protected Object getResult(int code){
        String message = this.getMessage(code);
        return this.getResult(code, message);
    }

    /**
     * 将字符串解析成实体
     * @param jsonStr json字符串
     * @param modelType 视图控制器类型
     * @return 返回实体
     */
    @SuppressWarnings("unchecked")
    protected <T> T parseObject(String jsonStr, Class<?> modelType){
        Class<T> clazz = (Class<T>) ClassReflectUtil.getParameterizedType(modelType)[1];
        return JSON.parseObject(jsonStr, clazz);
    }

    /**
     * 获取提示信息
     * @param code 状态码
     * @return 返回提示信息
     */
    private String getMessage(int code){
        String result = null;
        Properties properties = new Properties();
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("status.properties");

        try {
            properties.load(new InputStreamReader(in, "utf-8"));
        } catch (Exception e) {
            logger.error("错误", e);
        }

        result = properties.getProperty("status." + ClassTypeUtil.toString(code));
        return result;
    }
}
